Guest User

Cwiczenie 6

a guest
Dec 4th, 2011
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. /* Cwiczenie 6 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>  /* Funkcja system()         */
  5. #include <assert.h>  /* Makroinstrukcja assert() */
  6.  
  7. /* Definijemy typ uint jako typ unsigned int. */
  8. typedef unsigned int uint;
  9.  
  10. /* Definiujemy typ bool i stale dla dzialan logicznych. */
  11. /* Dla oszczednosci pamieci wybierzemy typ char.        */
  12. typedef char bool;
  13. #define true 1
  14. #define false 0
  15.  
  16.  
  17. #define MAX_PIERWSZA 10000000    /* Rozmiar tablicy prawdy */
  18.  
  19. bool czyPierwsza(uint liczba) {
  20.     static bool pierwsze[MAX_PIERWSZA];  /* Talica prawdy     */
  21.     static bool init = false;            /* Zainicjalizowana? */
  22.    
  23.     /* Uzyte zmienne statyczne zostana utworzone tylko raz, */
  24.     /* przy pierwszym wejsciu do ciala funkcji. Usuwane sa  */
  25.     /* dopiero przy zakonczeniu pracy programu.             */
  26.    
  27.     /* Najpierw sprawdzimy czy liczba miesci sie w zakresie */
  28.     /* Makroinstrukcja assert wylaczy program, gdy warunek  */
  29.     /* nie zostanie spelniony.                              */
  30.  
  31.     assert(liczba < MAX_PIERWSZA);
  32.    
  33.     /* Jezeli jestesmy pierwszy raz w ciele funkcji, musimy */
  34.     /* zainicjalizowac tablice prawdy.                      */
  35.  
  36.     if (!init) {
  37.         uint i, j;   /* Liczniki petli */
  38.        
  39.         /* Zastosujemy prosty algorytm - Sito Eratostenesa.     */
  40.         /* Jest on bardzo wydajny jesli chodzi o zlozonosc      */
  41.         /* obliczeniowa, ale potrzebuje duzej ilosci pamieci.   */
  42.         /* Domyslnie przyjmiemy, ze liczba jest pierwsza. Potem */
  43.         /* bedziemy sukcesywnie usuwac wielokrotnosci kolejnych */
  44.         /* liczb, przez co w tablicy prawdy zostana nam tylko   */
  45.         /* liczby pierwsze.                                     */
  46.  
  47.         pierwsze[0] = false;
  48.         pierwsze[1] = false;
  49.        
  50.         for (i = 2; i < MAX_PIERWSZA; i++)
  51.             pierwsze[i] = true;
  52.        
  53.         for (i = 2; i < MAX_PIERWSZA; i++)
  54.             for (j = 2*i; j < MAX_PIERWSZA; j += i)
  55.                 pierwsze[j] = false;
  56.        
  57.         /* Ustawiamy flage inicjalizacji na true. */
  58.         init = true;
  59.     }
  60.    
  61.     /* Zwracamy wartosc tablicy prawdy. */
  62.     return pierwsze[liczba];
  63. }
  64.  
  65.  
  66. /* Test! */
  67. /* Definiujemy prosta funkcje do testow. */
  68. void test(uint x) {
  69.     if (czyPierwsza(x))
  70.         printf("Liczba %u jest pierwsza!\n", x);
  71.     else
  72.         printf("Liczba %u nie jest pierwsza!\n", x);
  73. }
  74.  
  75.  
  76. int main(void) {   
  77.     puts("Rozpoczecie pracy programu!");
  78.     test(12435);
  79.     test(1);
  80.     test(12934);
  81.     test(2);
  82.    
  83.     puts("\nTeraz nastapi proba sprawdzenia zbyt duzej liczby!\n");
  84.     system("pause");
  85.     test(MAX_PIERWSZA);
  86.    
  87.    
  88.     return 0;
  89. }
  90.  
  91.  
Advertisement
Add Comment
Please, Sign In to add comment